package com.cg.baseproject.utils;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 主要功能:反射工具类
 *
 * @Prject: CommonUtilLibrary
 * @Package: com.jingewenku.abrahamcaijin.commonutil
 * @author: AbrahamCaiJin
 * @date: 2017年05月03日 16:18
 * @Copyright: 个人版权所有
 * @Company:
 * @version: 1.0.0
 */

public class ReflectionUtils {
        /**
         * 得到某个对象的公共属性
         *
         * @param owner, fieldName
         * @return 该属性对象
         * @throws Exception
         *
         */
        public Object getProperty(Object owner, String fieldName) throws Exception {
            Class ownerClass = owner.getClass();

            Field field = ownerClass.getField(fieldName);

            Object property = field.get(owner);

            return property;
        }

        /**
         * 得到某类的静态公共属性
         *
         * @param className   类名
         * @param fieldName   属性名
         * @return 该属性对象
         * @throws Exception
         */
        public Object getStaticProperty(String className, String fieldName)
            throws Exception {
            Class ownerClass = Class.forName(className);

            Field field = ownerClass.getField(fieldName);

            Object property = field.get(ownerClass);

            return property;
        }


        /**
         * 执行某对象方法
         *
         * @param owner
         *            对象
         * @param methodName
         *            方法名
         * @param args
         *            参数
         * @return 方法返回值
         * @throws Exception
         */
        public Object invokeMethod(Object owner, String methodName, Object[] args)
            throws Exception {

            Class ownerClass = owner.getClass();

            Class[] argsClass = new Class[args.length];

            for (int i = 0, j = args.length; i < j; i++) {
                argsClass[i] = args[i].getClass();
            }

            Method method = ownerClass.getMethod(methodName, argsClass);

            return method.invoke(owner, args);
        }


        /**
         * 执行某类的静态方法
         *
         * @param className
         *            类名
         * @param methodName
         *            方法名
         * @param args
         *            参数数组
         * @return 执行方法返回的结果
         * @throws Exception
         */
        public Object invokeStaticMethod(String className, String methodName,
            Object[] args) throws Exception {
            Class ownerClass = Class.forName(className);

            Class[] argsClass = new Class[args.length];


            for (int i = 0, j = args.length; i < j; i++) {
                argsClass[i] = args[i].getClass();
            }

            Method method = ownerClass.getMethod(methodName, argsClass);

            return method.invoke(null, args);
        }



        /**
         * 新建实例
         * @param className  类名
         * @param args    构造函数的参数
         * 如果无构造参数，args 填写为 null
         * @return 新建的实例
         * @throws Exception
         */
        public Object newInstance(String className, Object[] args,Class[] argsType) throws NoSuchMethodException, SecurityException, ClassNotFoundException,
            InstantiationException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException
        {
            Class newoneClass = Class.forName(className);

            if(args == null){
                return newoneClass.newInstance();

            }else{
                //             Class[] argsClass = new Class[args.length];
                //
                //             for (int i = 0, j = args.length; i < j; i++) {
                //                 argsClass[i] = args[i].getClass();
                //             }
                //
                //             Constructor cons = newoneClass.getConstructor(argsClass);
                Constructor cons = newoneClass.getConstructor(argsType);

                return cons.newInstance(args);
            }

        }



        /**
         * 是不是某个类的实例
         * @param obj 实例
         * @param cls 类
         * @return 如果 obj 是此类的实例，则返回 true
         */
        public boolean isInstance(Object obj, Class cls) {
            return cls.isInstance(obj);
        }

        /**
         * 得到数组中的某个元素
         * @param array 数组
         * @param index 索引
         * @return 返回指定数组对象中索引组件的值
         */
        public Object getByArray(Object array, int index) {
            return Array.get(array,index);
        }

        public Class<?> GetClassListByPackage(String pPackage) {
            Package _Package = Package.getPackage(pPackage);
            Class<?> _List =   _Package.getClass();

            return _List;
        }
    }
